(function ($) {
    /**
     * 分页列表
     * @param element
     * @param options
     * @constructor
     */
    function PageList(element, options) {
        var self = this,
            column = {
                name: [], //字段key
                align: [], //排列center,left,right
                render: [] //回调
            };
        self.opts = options;

        /**
         * 表头
         * @returns {string}
         */
        function header() {
            var domEle = '<thead><tr>';
            if (self.opts.checkbox) {
                domEle += '<th style="width:30px;"><input type="checkbox" class="all"></th>';
            }
            if (self.opts.index) {
                domEle += '<th  style="width: 40px;">序号</th>';
            }
            $.each(self.opts.column, function (index, item) {
                column.name.push(item.name);
                column.align.push(item.align || 'left');
                column.render.push(item.render || null);
                var width = item.width != null ? 'style="width:' + item.width + 'px;"' : '';
                domEle += '<th ' + width + '>' + item.title + '</th>';
            });
            domEle += '</tr></thead>';
            return domEle;
        }

        /**
         * 表内容
         * @param data
         * @returns {string}
         */
        function body(data) {
            var domEle = '';
            $.each(data, function (index, item) {
                domEle += '<tr>';
                if (self.opts.checkbox) {
                    domEle += '<td class="am-text-center"><input type="checkbox" value="' + item[self.opts.key] + '"></td>';
                }
                if (self.opts.index) {
                    domEle += '<td class="am-text-center" id="'+item[self.opts.key]+'">'+(index+1)+'</td>';
                }
                $.each(column.name, function (key, value) {
                    domEle += '<td class="am-text-' + column.align[key] + '">' + fieldType(key, item[value], item) + '</td>';
                });
                domEle += '</tr>';
            });
            return domEle;
        }

        /**
         * 设置字段显示类型
         * @param i
         * @param value
         * @param data
         * @returns {*}
         */
        function fieldType(i, value, data) {
            if (column.render[i] != null) {
                return column.render[i].call(this, value, data);
            } else {
                return value;
            }
        }

        /**
         * 请求数据
         * @param page
         */
        self.getAjaxData = function (page) {
            var params = $.extend({pageNo: page}, {pageSize: self.opts.pageSize}, self.opts.params);
            $.post(options.url + '?' + Math.random(), params, function (data) {
                try {
                    //回调
                    if (typeof self.opts.render == "function") {
                        self.opts.render.call(self, data);
                    }

                    if (data.success && data.pageInfo) {
                        element.find('tbody').html(body(data.pageInfo.records));
                        if (self.opts.page) {
                            laypage({
                                cont: self.opts.cont,
                                pages: data.pageInfo.pages,
                                curr: page || 1,
                                jump: function (obj, first) {
                                    // var text = document.createElement('span');
                                    // text.setAttribute('class', 'text');
                                    // text.innerText = obj.curr + '/' + obj.pages + '页 共' + data.pageInfo.total + '条记录';
                                    // if (!first) {
                                    //     self.getAjaxData(obj.curr);
                                    // }
                                    if ($('#' + self.opts.cont).find('text').length > 0) {
                                        $('#' + self.opts.cont).find('text').remove();
                                    }
                                    $('#' + self.opts.cont).append($('<span/>').addClass('text').html('共<font color="red">'+ data.pageInfo.total +'</font>条记录，当前第<font color="red">'+ obj.curr +'</font>页/共<font color="red">'+ obj.pages +'</font>页'));
                                    // document.getElementById(self.opts.cont).appendChild(text);
                                    if (!first) {
                                        self.getAjaxData(obj.curr);
                                    }
                                }
                            });
                        }
                    }else if(data.success && data.results.length > 0){
                        element.find('tbody').html(body(data.results));
                    } else {
                        if (self.opts.page) {
                            document.getElementById(self.opts.cont).innerHTML = '';
                        }
                        var col = self.opts.checkbox ? column.name.length + 1 : column.name.length;
                        var col = self.opts.index ? col + 1 : col;
                        element.find('tbody').html('<tr><td colspan="' + col + '">暂无数据</td></tr>');
                    }
                }
                catch (e) {
                    console.log(e.message);
                }
            }, 'json');
        };

        /**
         * 初始化
         */
        function init() {
            element.html(header() + '<tbody></tbody>');
            self.getAjaxData(1);
            //全选事件监听
            element.find('.all').on('click', function (e) {
                var checked = $(this).prop('checked');
                element.find('tbody :checkbox').prop('checked', checked);
            });
        }

        init();
    }

    /**
     * 表格
     * @param options
     * @returns {PageList}
     */
    $.fn.table = function (options) {
        var defaults = {
            url: '', //请求地址
            params: null,
            pageSize: 10,
            page: false, //是否显示分页控件,控件依赖于layPage.js
            cont: 'page', //分页控件填充容器
            key: 'id', //主键
            checked: false, //是否开启checked
            index:false,
            column: [], //列设置
            render: null
        };
        var element = $(this),
            opts = $.extend(defaults, options);
        return new PageList(element, opts);
    };

    $.fn.table.Constructor = PageList;
})(jQuery);